{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 实验三 Pandas数据分析\n",
    "## 3.1 pandas数据结构\n",
    "### 3.1.1 Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    0\n",
      "1    1\n",
      "2    2\n",
      "3    3\n",
      "4    4\n",
      "5    5\n",
      "6    6\n",
      "7    7\n",
      "8    8\n",
      "9    9\n",
      "dtype: int64\n",
      "0    0\n",
      "1    1\n",
      "2    2\n",
      "3    3\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "s1 = pd.Series(np.arange(10))\n",
    "print(s1)\n",
    "print(s1[0:4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a     1.000000\n",
      "b     7.333333\n",
      "c    13.666667\n",
      "d    20.000000\n",
      "dtype: float64\n",
      "a    1.000000\n",
      "b    7.333333\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "s2 = pd.Series(np.linspace(1,20,4),index=['a','b','c','d']) # 生成1-20的4个数，并指定索引为a,b,c,d\n",
    "print(s2)\n",
    "print(s2[['a','b']]) # 打印索引为a,b的元素"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1.2 DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    0   1   2   3\n",
      "0  29  36  47  40\n",
      "1  20  18  32  46\n",
      "2  40  25  11  38\n",
      "3  38  13  37  46\n",
      "4  17  42  48  33\n",
      "5  39  46  49  43\n",
      "6  22  19  36  16\n",
      "7  40  47  17  17\n",
      "8  46  41  11  23\n",
      "9  18  31  21  39\n",
      "********\n",
      "0    29\n",
      "1    20\n",
      "2    40\n",
      "3    38\n",
      "4    17\n",
      "5    39\n",
      "6    22\n",
      "7    40\n",
      "8    46\n",
      "9    18\n",
      "Name: 0, dtype: int32\n",
      "********\n",
      "    0   1   2   3\n",
      "0  29  36  47  40\n",
      "1  20  18  32  46\n",
      "2  40  25  11  38\n",
      "********\n",
      "    0   1   2   3\n",
      "0  29  36  47  40\n",
      "1  20  18  32  46\n",
      "2  40  25  11  38\n",
      "********\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "df = pd.DataFrame(np.random.randint(11,50,size=(10,4)))\n",
    "print(df,end='\\n********\\n')\n",
    "# DataFrame相当于集成多列Series，并把每一个Series作为一列，索引按照列来\n",
    "\n",
    "# 返回Series对象\n",
    "print(df[0],end='\\n********\\n') # 选择列打印，会返回一个Series对象\n",
    "\n",
    "# 返回DataFrame对象\n",
    "print(df[0:3],end='\\n********\\n') # 切片操作，df[0:3]选择前3行的所有数据\n",
    "print(df.loc[0:2],end='\\n********\\n') #使用loc访问器，选择0-2行的所有数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数据---------------------\n",
      "    a   d   c   b\n",
      "9  17  13  33  11\n",
      "3  38  35  19  19\n",
      "4  20  36  38  47\n",
      "6  44  39  37  36\n",
      "8  20  41  27  37\n",
      "0  26  27  29  30\n",
      "1  14  49  13  22\n",
      "2  39  31  15  28\n",
      "5  26  29  42  16\n",
      "7  36  47  13  43\n",
      "    a   d   c   b\n",
      "0  26  27  29  30\n",
      "1  14  49  13  22\n",
      "2  39  31  15  28\n",
      "3  38  35  19  19\n",
      "4  20  36  38  47\n",
      "5  26  29  42  16\n",
      "6  44  39  37  36\n",
      "7  36  47  13  43\n",
      "8  20  41  27  37\n",
      "9  17  13  33  11\n",
      "    a   b   c   d\n",
      "9  17  11  33  13\n",
      "3  38  19  19  35\n",
      "4  20  47  38  36\n",
      "6  44  36  37  39\n",
      "8  20  37  27  41\n",
      "0  26  30  29  27\n",
      "1  14  22  13  49\n",
      "2  39  28  15  31\n",
      "5  26  16  42  29\n",
      "7  36  43  13  47\n",
      "    a   d   c   b\n",
      "1  14  49  13  22\n",
      "9  17  13  33  11\n",
      "8  20  41  27  37\n",
      "4  20  36  38  47\n",
      "0  26  27  29  30\n",
      "5  26  29  42  16\n",
      "7  36  47  13  43\n",
      "3  38  35  19  19\n",
      "2  39  31  15  28\n",
      "6  44  39  37  36\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.randint(11,50,size=(10,4)),index=[9,3,4,6,8,0,1,2,5,7],columns=['a','d','c','b'])\n",
    "print('原数据---------------------')\n",
    "print(df)\n",
    "print(df.sort_index()) # 默认给行排序\n",
    "print(df.sort_index(axis=1)) # 给列排序\n",
    "print(df.sort_values(by='a'))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "row_index= 9\n",
      "a    41\n",
      "d    12\n",
      "c    46\n",
      "b    37\n",
      "Name: 9, dtype: int32\n",
      "row_index= 3\n",
      "a    22\n",
      "d    31\n",
      "c    25\n",
      "b    24\n",
      "Name: 3, dtype: int32\n",
      "row_index= 4\n",
      "a    29\n",
      "d    29\n",
      "c    44\n",
      "b    20\n",
      "Name: 4, dtype: int32\n",
      "row_index= 6\n",
      "a    24\n",
      "d    38\n",
      "c    17\n",
      "b    16\n",
      "Name: 6, dtype: int32\n",
      "row_index= 8\n",
      "a    37\n",
      "d    27\n",
      "c    34\n",
      "b    26\n",
      "Name: 8, dtype: int32\n",
      "row_index= 0\n",
      "a    43\n",
      "d    36\n",
      "c    27\n",
      "b    17\n",
      "Name: 0, dtype: int32\n",
      "row_index= 1\n",
      "a    31\n",
      "d    47\n",
      "c    30\n",
      "b    14\n",
      "Name: 1, dtype: int32\n",
      "row_index= 2\n",
      "a    23\n",
      "d    23\n",
      "c    25\n",
      "b    29\n",
      "Name: 2, dtype: int32\n",
      "row_index= 5\n",
      "a    22\n",
      "d    19\n",
      "c    48\n",
      "b    20\n",
      "Name: 5, dtype: int32\n",
      "row_index= 7\n",
      "a    20\n",
      "d    21\n",
      "c    11\n",
      "b    29\n",
      "Name: 7, dtype: int32\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.randint(11,50,size=(10,4)),index=[9,3,4,6,8,0,1,2,5,7],columns=['a','d','c','b'])\n",
    "# 遍历 DataFrame结构中的数据\n",
    "for row_index,row in df.iterrows():\n",
    "    print('row_index=',row_index)\n",
    "    print(row)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "基本功能\n",
      "    9   3   4   6   8   0   1   2   5   7\n",
      "a  48  20  19  47  33  43  42  28  32  32\n",
      "d  30  31  39  41  12  21  17  43  45  48\n",
      "c  43  34  17  24  30  21  13  43  37  30\n",
      "b  14  16  36  49  24  33  22  26  36  45\n",
      "[Index([9, 3, 4, 6, 8, 0, 1, 2, 5, 7], dtype='int64'), Index(['a', 'd', 'c', 'b'], dtype='object')]\n",
      "a    int32\n",
      "d    int32\n",
      "c    int32\n",
      "b    int32\n",
      "dtype: object\n",
      "False\n",
      "2\n",
      "(10, 4)\n",
      "40\n",
      "[[48 30 43 14]\n",
      " [20 31 34 16]\n",
      " [19 39 17 36]\n",
      " [47 41 24 49]\n",
      " [33 12 30 24]\n",
      " [43 21 21 33]\n",
      " [42 17 13 22]\n",
      " [28 43 43 26]\n",
      " [32 45 37 36]\n",
      " [32 48 30 45]]\n",
      "    a   d   c   b\n",
      "9  48  30  43  14\n",
      "3  20  31  34  16\n",
      "4  19  39  17  36\n",
      "6  47  41  24  49\n",
      "8  33  12  30  24\n",
      "    a   d   c   b\n",
      "0  43  21  21  33\n",
      "1  42  17  13  22\n",
      "2  28  43  43  26\n",
      "5  32  45  37  36\n",
      "7  32  48  30  45\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.randint(11,50,size=(10,4)),index=[9,3,4,6,8,0,1,2,5,7],columns=['a','d','c','b'])\n",
    "print('基本功能')\n",
    "print(df.T) # 转置输出\n",
    "print(df.axes) # 显示行列索引\n",
    "print(df.dtypes) # 显示每列的数据类型\n",
    "print(df.empty) # 判断是否为空\n",
    "print(df.ndim) # 显示维度数\n",
    "print(df.shape) # 显示形状（行数，列数）\n",
    "print(df.size) # 显示元素总数\n",
    "print(df.values) # 显示所有元素的值\n",
    "print(df.head()) # 显示前5行\n",
    "print(df.tail()) # 显示后5行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 高级索引\n",
    "### 3.2.1 reindex"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      x         y  z           a\n",
      "0   0.0  0.179532  a   84.766466\n",
      "1   2.0  0.215548  c   84.126684\n",
      "2   4.0  0.580247  c   84.186771\n",
      "3   6.0  0.501629  b   92.726193\n",
      "4   8.0  0.340272  a  121.554957\n",
      "5  10.0  0.605095  c   96.651791\n",
      "6  12.0  0.039655  a   85.229718\n",
      "7  14.0  0.758915  c  100.565213\n",
      "8  16.0  0.746327  a   99.793586\n",
      "9  18.0  0.737551  b   89.354535\n",
      "      x   C          a\n",
      "0   0.0 NaN  84.766466\n",
      "2   4.0 NaN  84.186771\n",
      "5  10.0 NaN  96.651791\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df = pd.DataFrame({\n",
    "   'x': np.linspace(0,stop=18,num=10), # 创建等间距数列\n",
    "   'y': np.random.rand(10),               # 创建随机数\n",
    "   'z': np.random.choice(['a','b','c'],10), # 随机选择字符\n",
    "   'a': np.random.normal(100, 10, size=(10)) # 正态分布随机数\n",
    "})\n",
    "# 获取df数据结构里面指定行和列组成新的数据集，若原数据中不存在则为NaN\n",
    "df1 = df.reindex(index=[0,2,5], columns=['x', 'C', 'a']) \n",
    "print(df)\n",
    "print(df1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2.2 set_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      x         y  z           a\n",
      "0   0.0  0.404212  b   90.596481\n",
      "1   2.0  0.941291  a  116.012716\n",
      "2   4.0  0.078217  b   95.100527\n",
      "3   6.0  0.547711  c   97.981548\n",
      "4   8.0  0.962333  b  102.858948\n",
      "5  10.0  0.095923  b  101.918425\n",
      "6  12.0  0.896422  b   90.185789\n",
      "7  14.0  0.968803  a   95.029818\n",
      "8  16.0  0.469026  a   99.177579\n",
      "9  18.0  0.766569  b   94.679992\n",
      "               x         y  z\n",
      "a                            \n",
      "90.596481    0.0  0.404212  b\n",
      "116.012716   2.0  0.941291  a\n",
      "95.100527    4.0  0.078217  b\n",
      "97.981548    6.0  0.547711  c\n",
      "102.858948   8.0  0.962333  b\n",
      "101.918425  10.0  0.095923  b\n",
      "90.185789   12.0  0.896422  b\n",
      "95.029818   14.0  0.968803  a\n",
      "99.177579   16.0  0.469026  a\n",
      "94.679992   18.0  0.766569  b\n",
      "90.59648137737449\n",
      "x         0.0\n",
      "y    0.404212\n",
      "z           b\n",
      "Name: 90.59648137737449, dtype: object\n",
      "                 x         y\n",
      "a          z                \n",
      "90.596481  b   0.0  0.404212\n",
      "116.012716 a   2.0  0.941291\n",
      "95.100527  b   4.0  0.078217\n",
      "97.981548  c   6.0  0.547711\n",
      "102.858948 b   8.0  0.962333\n",
      "101.918425 b  10.0  0.095923\n",
      "90.185789  b  12.0  0.896422\n",
      "95.029818  a  14.0  0.968803\n",
      "99.177579  a  16.0  0.469026\n",
      "94.679992  b  18.0  0.766569\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df = pd.DataFrame({\n",
    "   'x': np.linspace(0,stop=18,num=10),\n",
    "   'y': np.random.rand(10),\n",
    "   'z': np.random.choice(['a','b','c'],10),\n",
    "   'a': np.random.normal(100, 10, size=(10))\n",
    "})\n",
    "print(df)\n",
    "\n",
    "# 将'a'列的数据作为索引\n",
    "df1 = df.set_index('a')\n",
    "print(df1)\n",
    "print(df1.index[0]) # 生成的随机数为浮点数\n",
    "print(df1.loc[df1.index[0]])\n",
    "\n",
    "# 将'a'和'z'列的数据作为索引\n",
    "df2 = df.set_index(['a','z'])\n",
    "print(df2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 函数应用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    a   b   c   d\n",
      "0   0   1   2   3\n",
      "1   4   5   6   7\n",
      "2   8   9  10  11\n",
      "3  12  13  14  15\n",
      "    a   b   c   d\n",
      "0  -1   0   1   2\n",
      "1   3   4   5   6\n",
      "2   7   8   9  10\n",
      "3  11  12  13  14\n",
      "0     3\n",
      "1     7\n",
      "2    11\n",
      "3    15\n",
      "dtype: int64\n",
      "   a  b  c  d\n",
      "0  1 -1  1 -1\n",
      "1  1 -1  1 -1\n",
      "2  1 -1  1 -1\n",
      "3  1 -1  1 -1\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "data = np.arange(0,16).reshape(4,4)\n",
    "df = pd.DataFrame(data,columns=['a','b','c','d'])\n",
    "print(df)\n",
    "\n",
    "def f1(x):\n",
    "    return x-1\n",
    "def f2(x):\n",
    "    return np.max(x)\n",
    "def f3(x):\n",
    "    if np.mod(x,2) == 0:\n",
    "        return 1\n",
    "    else:\n",
    "        return -1\n",
    "\n",
    "# 矩阵内每个数据都执行该函数\n",
    "print(df.apply(f1))\n",
    "\n",
    "# 获取每行中的最大值，axis=1代表对每行获取最大值\n",
    "print(df.apply(f2,axis=1)) \n",
    "\n",
    "# map用于对数据进行转化，内置函数写转换条件\n",
    "print(df.map(f3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.4 遍历数据帧(DataFrame)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          a         b         c         d         e         h\n",
      "0 -0.991131 -0.262998  0.727989 -1.428367 -0.582507 -0.100049\n",
      "1  0.678058 -0.137750  1.061658 -0.642798 -0.184872  0.651199\n",
      "2  0.114470 -0.896867  0.284856 -1.432217 -0.510680 -0.198334\n",
      "3  0.491767 -1.254852 -0.163398  0.256357  0.841610 -0.029396\n",
      "4 -0.293694 -0.498274  1.422206  0.799039  1.479770 -0.406947\n",
      "5  2.257168  0.376737  1.315880 -0.403904 -0.587739  1.133905\n",
      "6 -0.625234 -0.892739  0.796879  2.200870 -1.052521 -0.310544\n",
      "7 -1.175506 -0.703744 -0.614743 -0.008425 -0.468321 -1.976070\n",
      "8 -0.259779 -0.829127 -0.022395 -1.773324 -0.646912  0.531729\n",
      "9 -0.343023  0.207178  1.398428 -0.287037  0.888135  0.264315\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df = pd.DataFrame(np.random.randn(10,6),columns=['a','b','c','d','e','h'])\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a\n",
      "0   -0.991131\n",
      "1    0.678058\n",
      "2    0.114470\n",
      "3    0.491767\n",
      "4   -0.293694\n",
      "5    2.257168\n",
      "6   -0.625234\n",
      "7   -1.175506\n",
      "8   -0.259779\n",
      "9   -0.343023\n",
      "Name: a, dtype: float64\n",
      "b\n",
      "0   -0.262998\n",
      "1   -0.137750\n",
      "2   -0.896867\n",
      "3   -1.254852\n",
      "4   -0.498274\n",
      "5    0.376737\n",
      "6   -0.892739\n",
      "7   -0.703744\n",
      "8   -0.829127\n",
      "9    0.207178\n",
      "Name: b, dtype: float64\n",
      "c\n",
      "0    0.727989\n",
      "1    1.061658\n",
      "2    0.284856\n",
      "3   -0.163398\n",
      "4    1.422206\n",
      "5    1.315880\n",
      "6    0.796879\n",
      "7   -0.614743\n",
      "8   -0.022395\n",
      "9    1.398428\n",
      "Name: c, dtype: float64\n",
      "d\n",
      "0   -1.428367\n",
      "1   -0.642798\n",
      "2   -1.432217\n",
      "3    0.256357\n",
      "4    0.799039\n",
      "5   -0.403904\n",
      "6    2.200870\n",
      "7   -0.008425\n",
      "8   -1.773324\n",
      "9   -0.287037\n",
      "Name: d, dtype: float64\n",
      "e\n",
      "0   -0.582507\n",
      "1   -0.184872\n",
      "2   -0.510680\n",
      "3    0.841610\n",
      "4    1.479770\n",
      "5   -0.587739\n",
      "6   -1.052521\n",
      "7   -0.468321\n",
      "8   -0.646912\n",
      "9    0.888135\n",
      "Name: e, dtype: float64\n",
      "h\n",
      "0   -0.100049\n",
      "1    0.651199\n",
      "2   -0.198334\n",
      "3   -0.029396\n",
      "4   -0.406947\n",
      "5    1.133905\n",
      "6   -0.310544\n",
      "7   -1.976070\n",
      "8    0.531729\n",
      "9    0.264315\n",
      "Name: h, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# 遍历方式一，以其内的Series为基本单位遍历\n",
    "for key,value in df.items():\n",
    "    print (key)\n",
    "    print(value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "a   -0.991131\n",
      "b   -0.262998\n",
      "c    0.727989\n",
      "d   -1.428367\n",
      "e   -0.582507\n",
      "h   -0.100049\n",
      "Name: 0, dtype: float64\n",
      "1\n",
      "a    0.678058\n",
      "b   -0.137750\n",
      "c    1.061658\n",
      "d   -0.642798\n",
      "e   -0.184872\n",
      "h    0.651199\n",
      "Name: 1, dtype: float64\n",
      "2\n",
      "a    0.114470\n",
      "b   -0.896867\n",
      "c    0.284856\n",
      "d   -1.432217\n",
      "e   -0.510680\n",
      "h   -0.198334\n",
      "Name: 2, dtype: float64\n",
      "3\n",
      "a    0.491767\n",
      "b   -1.254852\n",
      "c   -0.163398\n",
      "d    0.256357\n",
      "e    0.841610\n",
      "h   -0.029396\n",
      "Name: 3, dtype: float64\n",
      "4\n",
      "a   -0.293694\n",
      "b   -0.498274\n",
      "c    1.422206\n",
      "d    0.799039\n",
      "e    1.479770\n",
      "h   -0.406947\n",
      "Name: 4, dtype: float64\n",
      "5\n",
      "a    2.257168\n",
      "b    0.376737\n",
      "c    1.315880\n",
      "d   -0.403904\n",
      "e   -0.587739\n",
      "h    1.133905\n",
      "Name: 5, dtype: float64\n",
      "6\n",
      "a   -0.625234\n",
      "b   -0.892739\n",
      "c    0.796879\n",
      "d    2.200870\n",
      "e   -1.052521\n",
      "h   -0.310544\n",
      "Name: 6, dtype: float64\n",
      "7\n",
      "a   -1.175506\n",
      "b   -0.703744\n",
      "c   -0.614743\n",
      "d   -0.008425\n",
      "e   -0.468321\n",
      "h   -1.976070\n",
      "Name: 7, dtype: float64\n",
      "8\n",
      "a   -0.259779\n",
      "b   -0.829127\n",
      "c   -0.022395\n",
      "d   -1.773324\n",
      "e   -0.646912\n",
      "h    0.531729\n",
      "Name: 8, dtype: float64\n",
      "9\n",
      "a   -0.343023\n",
      "b    0.207178\n",
      "c    1.398428\n",
      "d   -0.287037\n",
      "e    0.888135\n",
      "h    0.264315\n",
      "Name: 9, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# 遍历方式二，按照行遍历\n",
    "for row_index,row in df.iterrows():\n",
    "    print (row_index)\n",
    "    print (row)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pandas(Index=0, a=-0.9911307050701392, b=-0.2629982790856318, c=0.7279892186529854, d=-1.4283666725319808, e=-0.58250721235137, h=-0.10004946753680852)\n",
      "Pandas(Index=1, a=0.6780581583052134, b=-0.1377501907109306, c=1.0616579030069355, d=-0.6427979566878861, e=-0.1848719459543791, h=0.6511992129422908)\n",
      "Pandas(Index=2, a=0.11447049346224193, b=-0.8968665186007032, c=0.28485566536335166, d=-1.4322171848491079, e=-0.5106799364155593, h=-0.19833449624277302)\n",
      "Pandas(Index=3, a=0.4917665076785231, b=-1.2548523472913597, c=-0.16339841035219477, d=0.256356592938212, e=0.8416101857987225, h=-0.02939646040945234)\n",
      "Pandas(Index=4, a=-0.2936937551688425, b=-0.49827416501010346, c=1.4222061690968364, d=0.7990393094395384, e=1.4797703686912533, h=-0.40694699316629357)\n",
      "Pandas(Index=5, a=2.257167770567958, b=0.37673713904163403, c=1.3158803746800698, d=-0.4039037559784663, e=-0.5877388054597638, h=1.133905422137403)\n",
      "Pandas(Index=6, a=-0.625233821077799, b=-0.8927388815520946, c=0.796879254750379, d=2.2008695036331196, e=-1.0525213108784364, h=-0.3105444748081277)\n",
      "Pandas(Index=7, a=-1.1755062656375352, b=-0.7037439426386921, c=-0.6147427262785788, d=-0.008424953035854492, e=-0.46832075830645364, h=-1.9760698515918185)\n",
      "Pandas(Index=8, a=-0.2597789342189291, b=-0.8291265819418185, c=-0.0223947879141394, d=-1.7733236653722415, e=-0.6469118541144369, h=0.5317287426193202)\n",
      "Pandas(Index=9, a=-0.343022852868326, b=0.2071784197190769, c=1.3984276042706814, d=-0.2870373236679863, e=0.8881345892491948, h=0.26431488587351376)\n"
     ]
    }
   ],
   "source": [
    "# 遍历方式三\n",
    "for row in df.itertuples():\n",
    "    print (row)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.5 统计函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      a     b     c     d     e\n",
      "0   1.0   3.0   5.0   7.0   9.0\n",
      "1  11.0  13.0  15.0  17.0  19.0\n",
      "2  21.0  23.0  25.0  27.0  29.0\n",
      "3  31.0  33.0  35.0  37.0  39.0\n",
      "4  41.0  43.0  45.0  47.0  49.0\n",
      "5  51.0  53.0  55.0  57.0  59.0\n",
      "6  61.0  63.0  65.0  67.0  69.0\n",
      "7  71.0  73.0  75.0  77.0  79.0\n",
      "8  81.0  83.0  85.0  87.0  89.0\n",
      "9  91.0  93.0  95.0  97.0  99.0\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# np.linspace(1,99,50)在1-99范围内，创建50个等距的数据，相当于等差数列\n",
    "df = pd.DataFrame(np.linspace(1,99,50).reshape(10,5),columns=['a','b','c','d','e'])\n",
    "print(df)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a    10\n",
      "b    10\n",
      "c    10\n",
      "d    10\n",
      "e    10\n",
      "dtype: int64\n",
      "a    460.0\n",
      "b    480.0\n",
      "c    500.0\n",
      "d    520.0\n",
      "e    540.0\n",
      "dtype: float64\n",
      "a    46.0\n",
      "b    48.0\n",
      "c    50.0\n",
      "d    52.0\n",
      "e    54.0\n",
      "dtype: float64\n",
      "a    46.0\n",
      "b    48.0\n",
      "c    50.0\n",
      "d    52.0\n",
      "e    54.0\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "#以Series为单位\n",
    "df = pd.DataFrame(np.linspace(1,99,50).reshape(10,5),columns=['a','b','c','d','e'])\n",
    "print(df.count())  # 计算每列非空值的数量\n",
    "print(df.sum()) # 计算每列的总和\n",
    "print(df.mean()) # 计算每列的平均值\n",
    "print(df.median()) # 计算每列的中位数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      a     b     c     d     e\n",
      "0   1.0   3.0   5.0   7.0   9.0\n",
      "1  11.0  13.0  15.0  17.0  19.0\n",
      "2  21.0  23.0  25.0  27.0  29.0\n",
      "3  31.0  33.0  35.0  37.0  39.0\n",
      "4  41.0  43.0  45.0  47.0  49.0\n",
      "5  51.0  53.0  55.0  57.0  59.0\n",
      "6  61.0  63.0  65.0  67.0  69.0\n",
      "7  71.0  73.0  75.0  77.0  79.0\n",
      "8  81.0  83.0  85.0  87.0  89.0\n",
      "9  91.0  93.0  95.0  97.0  99.0\n",
      "a    30.276504\n",
      "b    30.276504\n",
      "c    30.276504\n",
      "d    30.276504\n",
      "e    30.276504\n",
      "dtype: float64\n",
      "a    1.0\n",
      "b    3.0\n",
      "c    5.0\n",
      "d    7.0\n",
      "e    9.0\n",
      "dtype: float64\n",
      "a    91.0\n",
      "b    93.0\n",
      "c    95.0\n",
      "d    97.0\n",
      "e    99.0\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.linspace(1,99,50).reshape(10,5),columns=['a','b','c','d','e'])\n",
    "print(df.mode()) # 找出数据中出现次数最多的值，如果有多个值出现次数相同，则都会返回\n",
    "print(df.std()) # # 计算标准差\n",
    "print(df.min()) # 计算每列的最小值\n",
    "print(df.max()) # 计算每列的最大值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      a     b     c     d     e\n",
      "0   1.0   3.0   5.0   7.0   9.0\n",
      "1  11.0  13.0  15.0  17.0  19.0\n",
      "2  21.0  23.0  25.0  27.0  29.0\n",
      "3  31.0  33.0  35.0  37.0  39.0\n",
      "4  41.0  43.0  45.0  47.0  49.0\n",
      "5  51.0  53.0  55.0  57.0  59.0\n",
      "6  61.0  63.0  65.0  67.0  69.0\n",
      "7  71.0  73.0  75.0  77.0  79.0\n",
      "8  81.0  83.0  85.0  87.0  89.0\n",
      "9  91.0  93.0  95.0  97.0  99.0\n",
      "a    4.780159e+14\n",
      "b    2.394833e+15\n",
      "c    6.393839e+15\n",
      "d    1.386570e+16\n",
      "e    2.685395e+16\n",
      "dtype: float64\n",
      "       a      b      c      d      e\n",
      "0    1.0    3.0    5.0    7.0    9.0\n",
      "1   12.0   16.0   20.0   24.0   28.0\n",
      "2   33.0   39.0   45.0   51.0   57.0\n",
      "3   64.0   72.0   80.0   88.0   96.0\n",
      "4  105.0  115.0  125.0  135.0  145.0\n",
      "5  156.0  168.0  180.0  192.0  204.0\n",
      "6  217.0  231.0  245.0  259.0  273.0\n",
      "7  288.0  304.0  320.0  336.0  352.0\n",
      "8  369.0  387.0  405.0  423.0  441.0\n",
      "9  460.0  480.0  500.0  520.0  540.0\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.linspace(1,99,50).reshape(10,5),columns=['a','b','c','d','e'])\n",
    "print(df.abs()) # 计算每列的绝对值\n",
    "print(df.prod()) # 计算每列的乘积\n",
    "print(df.cumsum()) # 累积求和，前n个数的和  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              a             b             c             d             e\n",
      "0  1.000000e+00  3.000000e+00  5.000000e+00  7.000000e+00  9.000000e+00\n",
      "1  1.100000e+01  3.900000e+01  7.500000e+01  1.190000e+02  1.710000e+02\n",
      "2  2.310000e+02  8.970000e+02  1.875000e+03  3.213000e+03  4.959000e+03\n",
      "3  7.161000e+03  2.960100e+04  6.562500e+04  1.188810e+05  1.934010e+05\n",
      "4  2.936010e+05  1.272843e+06  2.953125e+06  5.587407e+06  9.476649e+06\n",
      "5  1.497365e+07  6.746068e+07  1.624219e+08  3.184822e+08  5.591223e+08\n",
      "6  9.133927e+08  4.250023e+09  1.055742e+10  2.133831e+10  3.857944e+10\n",
      "7  6.485088e+10  3.102517e+11  7.918066e+11  1.643050e+12  3.047776e+12\n",
      "8  5.252921e+12  2.575089e+13  6.730356e+13  1.429453e+14  2.712520e+14\n",
      "9  4.780159e+14  2.394833e+15  6.393839e+15  1.386570e+16  2.685395e+16\n",
      "               a          b          c          d          e\n",
      "count  10.000000  10.000000  10.000000  10.000000  10.000000\n",
      "mean   46.000000  48.000000  50.000000  52.000000  54.000000\n",
      "std    30.276504  30.276504  30.276504  30.276504  30.276504\n",
      "min     1.000000   3.000000   5.000000   7.000000   9.000000\n",
      "25%    23.500000  25.500000  27.500000  29.500000  31.500000\n",
      "50%    46.000000  48.000000  50.000000  52.000000  54.000000\n",
      "75%    68.500000  70.500000  72.500000  74.500000  76.500000\n",
      "max    91.000000  93.000000  95.000000  97.000000  99.000000\n",
      "           a         b         c         d         e\n",
      "0        NaN       NaN       NaN       NaN       NaN\n",
      "1  10.000000  3.333333  2.000000  1.428571  1.111111\n",
      "2   0.909091  0.769231  0.666667  0.588235  0.526316\n",
      "3   0.476190  0.434783  0.400000  0.370370  0.344828\n",
      "4   0.322581  0.303030  0.285714  0.270270  0.256410\n",
      "5   0.243902  0.232558  0.222222  0.212766  0.204082\n",
      "6   0.196078  0.188679  0.181818  0.175439  0.169492\n",
      "7   0.163934  0.158730  0.153846  0.149254  0.144928\n",
      "8   0.140845  0.136986  0.133333  0.129870  0.126582\n",
      "9   0.123457  0.120482  0.117647  0.114943  0.112360\n",
      "            a           b           c           d           e\n",
      "a  916.666667  916.666667  916.666667  916.666667  916.666667\n",
      "b  916.666667  916.666667  916.666667  916.666667  916.666667\n",
      "c  916.666667  916.666667  916.666667  916.666667  916.666667\n",
      "d  916.666667  916.666667  916.666667  916.666667  916.666667\n",
      "e  916.666667  916.666667  916.666667  916.666667  916.666667\n",
      "     a    b    c    d    e\n",
      "a  1.0  1.0  1.0  1.0  1.0\n",
      "b  1.0  1.0  1.0  1.0  1.0\n",
      "c  1.0  1.0  1.0  1.0  1.0\n",
      "d  1.0  1.0  1.0  1.0  1.0\n",
      "e  1.0  1.0  1.0  1.0  1.0\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.linspace(1,99,50).reshape(10,5),columns=['a','b','c','d','e'])\n",
    "print(df.cumprod()) # 累积乘积，按列\n",
    "print(df.describe()) # 描述性统计信息,计数、平均值、标准差、最小值、25%分位数:小于25%数据的值、50%分位数、75%分位数、最大值\n",
    "print(df.pct_change()) # 按列进行数据处理，计算百分比变化：(当前值 - 前一个值) / 前一个值\n",
    "print(df.cov())  # 计算协方差矩阵\n",
    "\n",
    "# 计算相关系数矩阵（Pearson相关系数）\n",
    "# 取值范围：[-1, 1]\n",
    "# 1：完全正相关，-1：完全负相关，0：无相关性\n",
    "print(df.corr())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.6 分组\n",
    "### 3.6.1 Group1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   a      b           c     d         e\n",
      "0  z  three   89.840477   1.0  0.130559\n",
      "1  y    one   98.224671   2.0  0.997875\n",
      "2  x    two  103.064324   3.0  0.914065\n",
      "3  x    one  115.729256   4.0  0.355308\n",
      "4  y    two   82.508416   5.0  0.943806\n",
      "5  x    one   92.869866   6.0  0.831231\n",
      "6  z    two   93.345190   7.0  0.062365\n",
      "7  x  three   97.561777   8.0  0.435371\n",
      "8  y  three  102.619600   9.0  0.005142\n",
      "9  z    two   98.469053  10.0  0.962600\n",
      "分组\n",
      "<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001CB9B0D97C0>\n",
      "分组后的groups\n",
      "{'x': [2, 3, 5, 7], 'y': [1, 4, 8], 'z': [0, 6, 9]}\n",
      "x分组\n",
      "   a      b           c    d         e\n",
      "2  x    two  103.064324  3.0  0.914065\n",
      "3  x    one  115.729256  4.0  0.355308\n",
      "5  x    one   92.869866  6.0  0.831231\n",
      "7  x  three   97.561777  8.0  0.435371\n",
      "遍历分组\n",
      "('x',    a      b           c    d         e\n",
      "2  x    two  103.064324  3.0  0.914065\n",
      "3  x    one  115.729256  4.0  0.355308\n",
      "5  x    one   92.869866  6.0  0.831231\n",
      "7  x  three   97.561777  8.0  0.435371)\n",
      "('y',    a      b           c    d         e\n",
      "1  y    one   98.224671  2.0  0.997875\n",
      "4  y    two   82.508416  5.0  0.943806\n",
      "8  y  three  102.619600  9.0  0.005142)\n",
      "('z',    a      b          c     d         e\n",
      "0  z  three  89.840477   1.0  0.130559\n",
      "6  z    two  93.345190   7.0  0.062365\n",
      "9  z    two  98.469053  10.0  0.962600)\n",
      "{('x', 'one'): [3, 5], ('x', 'three'): [7], ('x', 'two'): [2], ('y', 'one'): [1], ('y', 'three'): [8], ('y', 'two'): [4], ('z', 'three'): [0], ('z', 'two'): [6, 9]}\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df = pd.DataFrame({\n",
    "    'a': np.random.choice(['x','y','z'],10),\n",
    "    'b': np.random.choice(['one','two','three'],10),    \n",
    "    'c': np.random.normal(100, 10, size=(10)),\n",
    "    'd': np.linspace(1,10,10),\n",
    "    'e':np.random.rand(10),\n",
    "})\n",
    "print(df)\n",
    "print('分组')\n",
    "print(df.groupby(by='a'))\n",
    "print('分组后的groups')\n",
    "print(df.groupby(by='a').groups)\n",
    "print('x分组')\n",
    "print(df.groupby(by='a').get_group('x'))\n",
    "print('遍历分组')\n",
    "for group in df.groupby(by='a'):\n",
    "    print(group)\n",
    "print(df.groupby(by=['a','b']).groups)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.6.2 Group2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   a           c     d         e\n",
      "0  z  113.825152   1.0  0.585734\n",
      "1  y   99.179558   2.0  0.597119\n",
      "2  z   84.655389   3.0  0.745385\n",
      "3  z  110.612838   4.0  0.146655\n",
      "4  z   90.907397   5.0  0.625389\n",
      "5  x   92.422469   6.0  0.777853\n",
      "6  x  107.361949   7.0  0.974443\n",
      "7  y   91.793627   8.0  0.816228\n",
      "8  z  109.428460   9.0  0.532413\n",
      "9  x  106.998602  10.0  0.869530\n",
      "            c     d         e\n",
      "a                            \n",
      "x  107.361949  10.0  0.974443\n",
      "y   99.179558   8.0  0.816228\n",
      "z  113.825152   9.0  0.745385\n",
      "            c          d         e\n",
      "0  106.688871  10.000000  7.653327\n",
      "1   99.588934  14.142136  7.727347\n",
      "2   92.008363  17.320508  8.633571\n",
      "3  105.172638  20.000000  3.829553\n",
      "4   95.345371  22.360680  7.908151\n",
      "5   96.136605  24.494897  8.819598\n",
      "6  103.615611  26.457513  9.871387\n",
      "7   95.808991  28.284271  9.034533\n",
      "8  104.608059  30.000000  7.296662\n",
      "9  103.440128  31.622777  9.324857\n",
      "   a           c     d         e\n",
      "1  y   99.179558   2.0  0.597119\n",
      "5  x   92.422469   6.0  0.777853\n",
      "6  x  107.361949   7.0  0.974443\n",
      "7  y   91.793627   8.0  0.816228\n",
      "9  x  106.998602  10.0  0.869530\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df = pd.DataFrame({\n",
    "    'a': np.random.choice(['x','y','z'],10),\n",
    "    'c': np.random.normal(100, 10, size=(10)),\n",
    "    'd': np.linspace(1,10,10),\n",
    "    'e':np.random.rand(10),\n",
    "})\n",
    "print(df)\n",
    "print(df.groupby(by='a').agg('max')) # 按列'a'分组，并计算每组的最大值\n",
    "\n",
    "print(df.groupby(by='a').transform(lambda x: np.sqrt(x)*10)) # 按列'a'分组，对每组的数据进行转换：计算平方根后乘以10\n",
    "print(df.groupby(by='a').filter(lambda x: len(x)<4)) # 按列'a'分组，筛选出组内数据量小于4的组"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.7 透视表和交叉表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     total_bill   tip     sex smoker   day    time  size\n",
      "0         16.99  1.01  Female     No   Sun  Dinner     2\n",
      "1         10.34  1.66    Male     No   Sun  Dinner     3\n",
      "2         21.01  3.50    Male     No   Sun  Dinner     3\n",
      "3         23.68  3.31    Male     No   Sun  Dinner     2\n",
      "4         24.59  3.61  Female     No   Sun  Dinner     4\n",
      "..          ...   ...     ...    ...   ...     ...   ...\n",
      "239       29.03  5.92    Male     No   Sat  Dinner     3\n",
      "240       27.18  2.00  Female    Yes   Sat  Dinner     2\n",
      "241       22.67  2.00    Male    Yes   Sat  Dinner     2\n",
      "242       17.82  1.75    Male     No   Sat  Dinner     2\n",
      "243       18.78  3.00  Female     No  Thur  Dinner     2\n",
      "\n",
      "[244 rows x 7 columns]\n",
      "                    tip  total_bill\n",
      "sex    smoker                      \n",
      "Male   Yes     3.051167   22.284500\n",
      "       No      3.113402   19.791237\n",
      "Female Yes     2.931515   17.977879\n",
      "       No      2.773519   18.105185\n",
      "smoker       Yes   No  All\n",
      "time   day                \n",
      "Lunch  Thur   17   44   61\n",
      "       Fri     6    1    7\n",
      "Dinner Thur    0    1    1\n",
      "       Fri     9    3   12\n",
      "       Sat    42   45   87\n",
      "       Sun    19   57   76\n",
      "All           93  151  244\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "tips = sns.load_dataset('tips')\n",
    "print(tips)\n",
    "# # 绘制散点图\n",
    "# sns.scatterplot(x='tip', y='total_bill', data=tips)\n",
    "# plt.show()\n",
    "# # 绘制折线图\n",
    "# sns.lineplot(x='tip', y='total_bill', data=tips)\n",
    "# plt.show()\n",
    "\n",
    "\n",
    "# 透视表\n",
    "# 正确的写法，指定要计算平均值的数值列\n",
    "print(tips.pivot_table(\n",
    "    values=['total_bill', 'tip'],  # 指定要聚合的数值列\n",
    "    index=['sex', 'smoker'],       # 分组的索引\n",
    "    aggfunc='mean',                 # 指定聚合函数，mean为平均值\n",
    "    observed=False                 # 显式指定observed参数\n",
    "))\n",
    "\n",
    "# 交叉表\n",
    "print(pd.crosstab([tips.time,tips.day],tips.smoker,margins=True))\n",
    "# 参数说明：\n",
    "# 第一个参数 [tips.time, tips.day]：\n",
    "# 这是行索引，使用两个变量组合\n",
    "# 第二个参数 tips.smoker：\n",
    "# 这是列索引\n",
    "# margins=True：\n",
    "# 添加汇总行和汇总列\n",
    "# 显示每行、每列的总计（All）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABmC0lEQVR4nO3de3yO9ePH8de9g83MzFnOpxIK8RUpJIcoQkg55RwJUaLyTUd0PlCJlBRFCB2Eb+mkCMkhQzmfcpxtzLZ79+7fH5/fvbWcNrZ97sP7+XjscV+bzd7b5bb3rutzcLjdbjciIiIiIl4myHYAEREREZFzUVEVEREREa+koioiIiIiXklFVURERES8koqqiIiIiHglFVURERER8UoqqiIiIiLilVRURURERMQrqaiKiFjmdrvR3isiImdTURURyYbx48dz8OBBAHbu3Mnq1asz/fmOHTtYtmzZeT9+8eLFlCpVisTExPS3/fjjj1SqVIm1a9fmTmgRER+loioikg3PPvss8fHxAKxevZqWLVtm+vM1a9YwYMCA8358gQIFOHz4MGFhYelvmzt3LhEREdStW/ein//DDz+kXbt2HD58ONPbr7/+ekaMGAHAnj17zvmxTz/9NA6HI1svxYoVu2gmEZHcEmI7gIiILwkJCSF//vzpx2XKlMn056GhoURGRp71cb169eKqq67i5ptvBiA4OBiAU6dO8fHHH3PHHXfw1VdfnfVxderUoWzZsumvv/XWW1SoUIGSJUtmer+UlBQADhw4QM2aNZkyZQo9evQ4K3vdunVZuXJl+ttWr17Njh076Nq1a3omj48//pixY8de8PshIpKbVFRFRLLg+PHjhIWFERQUxJkzZ0hKSiI4OJiCBQumv09CQgJpaWmEhISQlJQEQL58+QgKCuL777+nadOm6e/rdDpxu91MnjwZt9vNDz/8wCeffMLVV1/N77//To0aNYiJiWHOnDl06dIFgGXLlrFjxw6+/PJLEhISMn3u6OhoIiIiKFOmDK+//jqbN28+62sICQnB4XAQHh6e/raxY8fy999/06FDByIiIgBwOByEhYURGhp6VnkVEclLuvUvIpIFFSpUoGDBgsTFxVG9enVmzJgBmML53XffsXjxYrp06cJdd93Fxo0byZ8/P/nz5+fbb78lOTmZAwcO0L9/fxo3bgyYAjt48GAmTJjA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",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import font_manager\n",
    "\n",
    "# 设置中文字体和默认字体\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False     # 用来正常显示负号\n",
    "plt.rcParams['font.family'] = ['sans-serif', 'DejaVu Sans']  # 添加 DejaVu Sans 作为后备字体\n",
    "\n",
    "# 创建x轴数据点\n",
    "x = np.linspace(-5, 5, 100)\n",
    "\n",
    "# 创建抛物线函数 y = x^2\n",
    "y = x**2\n",
    "\n",
    "# 创建图形\n",
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(x, y, 'b-', label='y = x^2')  # 使用 ^2 替代 ²\n",
    "\n",
    "# 添加标题和标签\n",
    "plt.title('抛物线图')\n",
    "plt.xlabel('x轴')\n",
    "plt.ylabel('y轴')\n",
    "plt.grid(True)  # 添加网格\n",
    "plt.legend()\n",
    "\n",
    "# 添加x轴和y轴\n",
    "plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)\n",
    "plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)\n",
    "\n",
    "# 显示图形\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python39",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.21"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
